import {
    UPDATE_WEATHER,
    LOADING_STATE,
    POSITION_ID
} from './mutations_type'
import {
    getCurrentTypeDayData,
    getCity,
} from '../api'
import axios from 'axios'

export default {
    getGeoPosition(context) {
        // 1.申请获取地理定位
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(
                pos => getLocation(pos), // 成功函数
                e => showError(e), // 失败函数
                {
                    timeout: 5000
                } // PositionOptions参数 设置超时时间
            );
        } else {
            alert("浏览器不支持地理定位！");
        }
        // 2.成功获取到定位
        const getLocation = pos => {
            console.log('地理定位：', pos);
            // 判断是否已获取到定位 ? 返回经纬度 : 直接使用ip定位
            // pos = pos ? `${pos.coords.longitude},${pos.coords.latitude}` : "auto_ip";
            pos = `${pos.coords.longitude},${pos.coords.latitude}`;
            this.dispatch('getWeather', pos);
            context.commit(POSITION_ID, pos);
        };

        // 3.定位失败反馈
        function showError(error) {
            // vm.$store.state.posError = true;
            // 先自动获取一次假数据 防止页面空白
            // vm.$store.dispatch('getWeather', 'auto_ip');

            switch (error.code) {
                case error.PERMISSION_DENIED:
                    alert("定位失败，用户拒绝请求地理定位");
                    break;
                case error.POSITION_UNAVAILABLE:
                    alert("定位失败，位置信息是不可用");
                    break;
                case error.TIMEOUT:
                    alert("定位失败，请求获取用户位置超时");
                    break;
                case error.UNKNOWN_ERROR:
                    alert("未知错误，定位系统失效");
                    break;
            }
        }
    },
    getWeather(context, pos) {
        axios.all([getCity(pos), getCurrentTypeDayData(pos, 'now'), getCurrentTypeDayData(pos, '7d'), getCurrentTypeDayData(pos, 'life', 0, 'zh'), getCurrentTypeDayData(pos, 'warning'), getCurrentTypeDayData(pos, '24h'), getCurrentTypeDayData(pos, 'air')]).then(axios.spread(
            (city_data, currDay_data, sevenDay_data, lifeIndex_data, warning_data, hours_data, air_data) => {
                // 请求状态的开关
                let sendState = null,
                    // 请求形参数组
                    requestState_arr = [city_data, currDay_data, sevenDay_data, lifeIndex_data, warning_data, hours_data, air_data];
                // 判断请求参数中的状态属性是否都等于 200, 成功或者失败来改变请求状态
                for (let i = 0; i < requestState_arr.length; i++) {
                    sendState = requestState_arr[i].data.code == '200' ? true : false;
                }
                // 判断请求状态
                if (sendState) {
                    // 成功关闭loading
                    context.commit(LOADING_STATE, false);
                    // 成功调用updateWeather函数保存数据
                    context.commit(UPDATE_WEATHER, {
                        city_data,
                        currDay_data,
                        sevenDay_data,
                        lifeIndex_data,
                        warning_data,
                        hours_data,
                        air_data
                    });
                } else {
                    // 失败关闭loading
                    context.commit(LOADING_STATE, true);
                    this._vm.$notify({
                        message: "数据获取失败",
                        background: "red",
                        color: "#fff",
                        duration: 2200,
                    })
                }
            }))
    }
}